﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Web.UI.HtmlControls;

namespace IHISCETeim.Library
{
    /// <summary>
    /// Object扩展类
    /// </summary>
    public static class ObjectExt
    {
        #region  强行把 Object 类型转化为 T,失败则返回 T 的默认值
        /// <summary>
        /// 强行把 Object 类型转化为 T,失败则返回 T 的默认值(最好是能转化成功的)
        /// </summary>
        /// <typeparam name="T">目标类型</typeparam>
        /// <param name="o">被转化的 object</param>
        /// <returns>default(T)</returns>
        public static T ConvertToType<T>(this object o)
        {
            try
            {
                return (T)System.Convert.ChangeType(o, typeof(T));
            }
            catch
            {
                return default(T);
            }
        }

        #endregion

        #region  强行把 Object 类型转化为 T,失败则返回 T 的指定默认值
        /// <summary>
        /// 强行把 Object 类型转化为 T,失败则返回 T 的指定默认值(最好是能转化成功的)
        /// </summary>
        /// <typeparam name="T">目标类型</typeparam>
        /// <param name="o">被转化的 object</param>
        /// <param name="defaultValue">默认值</param>
        /// <returns></returns>
        public static T ConvertToType<T>(this object o, T defaultValue)
        {
            try
            {
                return (T)System.Convert.ChangeType(o, typeof(T));
            }
            catch
            {
                return defaultValue;
            }
        }
        #endregion

        #region  判断Object能否被强行转化为T类型
        /// <summary>
        /// 判断Object能否被强行转化为T类型
        /// (如 判断时间字符串 2007-13-1 是错误的时间格式)
        /// 
        /// </summary>
        /// <typeparam name="T">目标类型</typeparam>
        /// <param name="o">被转化的 object</param>
        /// <returns></returns>
        public static bool CanBeConvertToType<T>(this object o)
        {
            try
            {
                T t = (T)System.Convert.ChangeType(o, typeof(T));
                return true;
            }
            catch
            {
                return false;
            }
        }
        #endregion

        #region  如果为null,返回默认值
        /// <summary>
        /// 如果为null,返回默认值
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="defaultVal"></param>
        /// <returns></returns>
        public static T DefaultIfNull<T>(this T obj, T defaultVal)
        {
            return (obj != null ? obj : defaultVal);
        }
        #endregion
    }
}
